package br.com.skytef.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import br.com.skytef.entity.EstabelecimentoEntity;
import br.com.skytef.jdbc.ConnectionFactory;
import br.com.skytef.utils.utils;

public class EstabelecimentoDao {
	private static String erro;
	public Connection connection;
	
	public EstabelecimentoDao() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public EstabelecimentoDao(HttpSession session) {
		this.connection = utils.recuperaDBConnection(session);
	}

	public EstabelecimentoDao(Connection con) {
		this.connection = con;
	}

	public Connection getConnection(){
		return connection;
	}

	public static String getErro() {
		return erro;
	}
		
	public EstabelecimentoEntity insertEstabelecimento(EstabelecimentoEntity estabelecimento) throws Exception {
		try {
			String query = "INSERT INTO estabelecimento(razao_social, cnpj, inscricao_Est, endereco, bairro, " 
					+ "cep, cidade, uf, nome_contato, tel_coml, celular, email, site) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);";
			
			PreparedStatement stmt = connection.prepareStatement(query);
				
//			stmt.setInt(1, estabelecimento.getIdEstabelecimento());
			stmt.setString(1, estabelecimento.getRazaoSocial());
			stmt.setString(2, estabelecimento.getCnpj());
			stmt.setString(3, estabelecimento.getInscricaoEstadual());
			stmt.setString(4, estabelecimento.getEndereco());
			stmt.setString(5, estabelecimento.getBairro());
			stmt.setString(6, estabelecimento.getCep());
			stmt.setString(7, estabelecimento.getCidade());
			stmt.setString(8, estabelecimento.getUf());
			stmt.setString(9, estabelecimento.getNomeContato());
			stmt.setString(10, estabelecimento.getTelefone());
			stmt.setString(11, estabelecimento.getCelular());
			stmt.setString(12, estabelecimento.getEmail());
			stmt.setString(13, estabelecimento.getSite());
						
			stmt.execute();    
			stmt.close();

		} catch (SQLException e) {
			erro = e.toString();
			throw new Exception(e);
		} catch (Exception e) {
			erro = e.toString();
			throw new Exception(e);
		}

		return estabelecimento;
	}
	
	public EstabelecimentoEntity updateEstabelecimento(EstabelecimentoEntity estabelecimento) throws SQLException {
		try {
			String query = "UPDATE estabelecimento SET razao_social=?, cnpj=?, inscricao_Est=?, endereco=?, bairro=?, "
					+ "cep=?, cidade=?, uf=?, nome_contato=?, tel_coml=?, celular=?, email=?, site=? WHERE idEstabelecimento=? ;";
			PreparedStatement stmt = connection.prepareStatement(query);

			stmt.setString(1, estabelecimento.getRazaoSocial());
			stmt.setString(2, estabelecimento.getCnpj());
			stmt.setString(3, estabelecimento.getInscricaoEstadual());
			stmt.setString(4, estabelecimento.getEndereco());
			stmt.setString(5, estabelecimento.getBairro());
			stmt.setString(6, estabelecimento.getCep());
			stmt.setString(7, estabelecimento.getCidade());
			stmt.setString(8, estabelecimento.getUf());
			stmt.setString(9, estabelecimento.getNomeContato());
			stmt.setString(10, estabelecimento.getTelefone());
			stmt.setString(11, estabelecimento.getCelular());
			stmt.setString(12, estabelecimento.getEmail());
			stmt.setString(13, estabelecimento.getSite());
			stmt.setInt(14, estabelecimento.getIdEstabelecimento());
			stmt.executeUpdate();
			
			stmt.close();
		} catch (SQLException e) {
			erro = e.toString();
		} catch (Exception e) {
			erro = e.toString();
		}
		return estabelecimento;
	}
	
	public List<EstabelecimentoEntity> buscarTodos() {
		List<EstabelecimentoEntity> estabs = null;
		EstabelecimentoEntity estabelecimento;
		try {
			Connection connection = new ConnectionFactory().getConnection();
			Statement st = connection.createStatement();
			ResultSet rs = st.executeQuery("Select * from estabelecimento ");
			if (rs.next()) {
				estabs = new ArrayList<EstabelecimentoEntity>();
				do {

					estabelecimento = new EstabelecimentoEntity();
					estabelecimento.setIdEstabelecimento(rs.getInt("idEstabelecimento"));
					estabelecimento.setRazaoSocial(rs.getString("razao_social"));
					estabelecimento.setCnpj(rs.getString("cnpj"));
					estabelecimento.setInscricaoEstadual(rs.getString("inscricao_Est"));
					estabelecimento.setEndereco(rs.getString("endereco"));
					estabelecimento.setBairro(rs.getString("bairro"));
					estabelecimento.setCep(rs.getString("cep"));
					estabelecimento.setCidade(rs.getString("cidade"));
					estabelecimento.setUf(rs.getString("uf"));
					estabelecimento.setNomeContato(rs.getString("nome_contato"));
					estabelecimento.setTelefone(rs.getString("tel_coml"));
					estabelecimento.setCelular(rs.getString("celular"));
					estabelecimento.setEmail(rs.getString("email"));
					estabelecimento.setSite(rs.getString("site"));
								
					estabs.add(estabelecimento);
				} while (rs.next());
			}
			rs.close();
			connection.close();
		} catch (SQLException e) {
			System.out.println("SQL erro: " + e);
		} catch (Exception e) {
			System.out.println("Geral erro: " + e);
		}
		return estabs;
	}
	
	public boolean deleteEstabelecimento(EstabelecimentoEntity estabelecimento) {
		try {
			PreparedStatement stmt = connection.prepareStatement(
					"DELETE FROM estabelecimento WHERE idEstabelecimento=?;");
			
			stmt.setInt(1, estabelecimento.getIdEstabelecimento());
			System.out.println("id do estabelecimento a ser deletado: " + estabelecimento.getIdEstabelecimento());
			stmt.execute();
			stmt.close();
			return true;
			
		}  catch(SQLException e) {
			System.out.println("SQL erro: " + e);
			return false;
		} catch (Exception e) {
			System.out.println("Geral erro: " + e);
			return false;
		}
	}

	/*-------------------------------------------------------------------------------------------
	 * SELECT
	 -------------------------------------------------------------------------------------------*/	

		
	public EstabelecimentoEntity getEstabelecimento(int idEstabelecimento) throws SQLException {
		EstabelecimentoEntity estabelecimento = null;

		String qry = "SELECT * from estabelecimento where idEstabelecimento = " + idEstabelecimento;
		EstabelecimentoEntity estab = this.exeQuery(qry);
		
		return estab;
	}
	

	public EstabelecimentoEntity buscaPorNome(String razaoSocial) throws SQLException {
		String qry = "select * from estabelecimento where razao_social = '"  + razaoSocial + "';";
		EstabelecimentoEntity estab = this.exeQuery(qry);
		
		return estab;
	}
	
	public EstabelecimentoEntity buscaPorPos(String serial) throws SQLException {
		StringBuilder qry = new StringBuilder();
		
		qry.append("SELECT * "); 
		qry.append("FROM   estabelecimento est "); 
		qry.append("       INNER JOIN pos "); 
		qry.append("               ON est.idestabelecimento = pos.idestabelecimento "); 
		qry.append("WHERE  pos.num_serie_pos = '" + serial + "';"); 
				
		EstabelecimentoEntity estab = this.exeQuery(qry.toString());
		
		return estab;
	}
	
	public EstabelecimentoEntity buscaPorUsuario(int idUser) throws SQLException {
		StringBuilder qry = new StringBuilder();
		
		qry.append("SELECT est.* ");
		qry.append("FROM   estacionamento.estabelecimento est "); 
		qry.append("       INNER JOIN operador opr "); 
		qry.append("               ON est.idestabelecimento = opr.idestabelecimento "); 
		qry.append("WHERE  opr.idoperador = " + idUser + ";"); 
				
		EstabelecimentoEntity estab = this.exeQuery(qry.toString());
		
		return estab;
	}
	

	/*
	 * Executa qualquer query	
	 */
	public EstabelecimentoEntity exeQuery(String sql) {
		EstabelecimentoEntity estabelecimento = new EstabelecimentoEntity();
		
		try {
			Connection conn = new ConnectionFactory().getConnection();;
			PreparedStatement stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			if (rs.next()) {
				
				estabelecimento.setIdEstabelecimento(rs.getInt("idEstabelecimento"));
				estabelecimento.setRazaoSocial(rs.getString("razao_social"));
				estabelecimento.setCnpj(rs.getString("cnpj"));
				estabelecimento.setInscricaoEstadual(rs.getString("inscricao_Est"));
				estabelecimento.setEndereco(rs.getString("endereco"));
				estabelecimento.setBairro(rs.getString("bairro"));
				estabelecimento.setCep(rs.getString("cep"));
				estabelecimento.setCidade(rs.getString("cidade"));
				estabelecimento.setUf(rs.getString("uf"));
				estabelecimento.setNomeContato(rs.getString("nome_contato"));
				estabelecimento.setTelefone(rs.getString("tel_coml"));
				estabelecimento.setCelular(rs.getString("celular"));
				estabelecimento.setEmail(rs.getString("email"));
				estabelecimento.setSite(rs.getString("site"));
				
			}
			rs.close();
			stmt.close();
			return estabelecimento;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public EstabelecimentoEntity getCnpj(String cnpj) throws SQLException {
		
		Connection connection = new ConnectionFactory().getConnection();
		connection.setAutoCommit(true);
		PreparedStatement stmt = connection.prepareStatement(this.getQrySelectCnpj());
	
		try {			
			stmt.setString(1, cnpj);
			ResultSet rs = stmt.executeQuery();
			EstabelecimentoEntity estabelecimento = new EstabelecimentoEntity();
	
			if (rs.next()) {
				estabelecimento = new EstabelecimentoEntity();
					
				estabelecimento.setIdEstabelecimento(rs.getInt("idEstabelecimento"));
				estabelecimento.setRazaoSocial(rs.getString("razao_social"));
				estabelecimento.setCnpj(rs.getString("cnpj"));
				estabelecimento.setInscricaoEstadual(rs.getString("inscricao_Est"));
				estabelecimento.setEndereco(rs.getString("endereco"));
				estabelecimento.setBairro(rs.getString("bairro"));
				estabelecimento.setCep(rs.getString("cep"));
				estabelecimento.setCidade(rs.getString("cidade"));
				estabelecimento.setUf(rs.getString("uf"));
				estabelecimento.setNomeContato(rs.getString("nome_contato"));
				estabelecimento.setTelefone(rs.getString("tel_coml"));
				estabelecimento.setCelular(rs.getString("celular"));
				estabelecimento.setEmail(rs.getString("email"));
				estabelecimento.setSite(rs.getString("site"));
				
				rs.close();
				stmt.close();
				connection.close();
				return estabelecimento;
			} else {
				rs.close();
				stmt.close();
				connection.close();
				return estabelecimento;
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	private String getQrySelectID() {
		StringBuffer sql = new StringBuffer();
	
		sql.append("SELECT idEstabelecimento, ");
		sql.append("	   razao_social, ");
		sql.append("       cnpj, ");
		sql.append("       inscricao_Est, ");
		sql.append("       endereco, ");
		sql.append("       bairro, ");
		sql.append("       cep, ");
		sql.append("       cidade, ");
		sql.append("       uf, ");
		sql.append("       cep, ");
		sql.append("       nome_contato, ");
		sql.append("       tel_coml, ");
		sql.append("       celular, ");
		sql.append("       email, ");
		sql.append("       site ");
		sql.append("FROM estacionamento.estabelecimento ");
		sql.append("where idEstabelecimento = ?; ");
	
		return sql.toString();
	}
	
	private String getQrySelectRazaoSocial() {
		StringBuffer sql = new StringBuffer();
	
		sql.append("SELECT idEstabelecimento, ");
		sql.append("	   razao_social, ");
		sql.append("       cnpj, ");
		sql.append("       inscricao_Est, ");
		sql.append("       endereco, ");
		sql.append("       bairro, ");
		sql.append("       cep, ");
		sql.append("       cidade, ");
		sql.append("       uf, ");
		sql.append("       cep, ");
		sql.append("       nome_contato, ");
		sql.append("       tel_coml, ");
		sql.append("       celular, ");
		sql.append("       email, ");
		sql.append("       site ");
		sql.append("FROM estacionamento.estabelecimento ");
		sql.append("where razao_social = ?; ");
	
		return sql.toString();
	}
	
	/*-------------------------------------------------------------------------------------------
	 * Query
	 -------------------------------------------------------------------------------------------*/
	private String getQrySelectCnpj() {
		StringBuffer sql = new StringBuffer();
	
		sql.append("SELECT idEstabelecimento, ");
		sql.append("	   razao_social, ");
		sql.append("       cnpj, ");
		sql.append("       inscricao_Est, ");
		sql.append("       endereco, ");
		sql.append("       bairro, ");
		sql.append("       cep, ");
		sql.append("       cidade, ");
		sql.append("       uf, ");
		sql.append("       cep, ");
		sql.append("       nome_contato, ");
		sql.append("       tel_coml, ");
		sql.append("       celular, ");
		sql.append("       email, ");
		sql.append("       site ");
		sql.append("FROM estacionamento.estabelecimento ");
		sql.append("where cnpj = ?; ");
	
		return sql.toString();
	}	
}
